<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+


/**
 * @file ../tests/index.php
 * @brief файл содержит точку входа для запуска всех тестов проекта "WebFormsQA" \n
 *        исходный код находится в разделе примеры
 * @example ../tests/index.php 
 */


//настройки среды
session_start();
ini_set("display_errors", "1");

// учитываем локальный путь, от текущего каталога tests
define('DIR_TEST_UNIT', dirname(__FILE__).'/phpunit/');
require_once(DIR_TEST_UNIT.'PHPUnit.php');


// текущим каталогом будет не tests/ а основной
chdir("..");
require_once( "main_define.php" );

define('TEST_DIR', INCLUDES_DIR.'tests/');
define('TEST_BASE_DIR', BASE_DIR.'tests/');


// *********************************************************************
//    СПИСОК СПЕЦИАЛИЗИРОВАННЫХ ПЕРЕМЕННЫХ используемых ТОЛЬКО тестами
// *********************************************************************
define ('TEST_PROJECT', '1');

// ************************** END **************************************



require_once(CONFIG_DIR.'tables.inc.php');
require_once(CONFIG_DIR.'total.const.php');

require_once(LANGUAGE_DIR.'russian.php');

require_once(BASE_DIR.'navigation.class.php');                  // класс навигации
require_once(BASE_DIR.'database.class.php');                    // класс для работы с базой данных mysql
require_once(BASE_DIR.'search.class.php');                      // базовый класс поиска информации

require_once(INCLUDES_DIR. 'nav_question.class.php');
require_once(INCLUDES_DIR. 'question_base.class.php');          // класс для работы с базой данных Questions
require_once(INCLUDES_DIR. 'search_question.class.php');        // класс поиска в базе "Questions"

require_once(BASE_DIR. 	   'page.class.php');                   // класс базовой страницы
require_once(INCLUDES_DIR. 'main_page.class.php');           	// класс главной страницы
require_once(INCLUDES_DIR. 'answer_page.class.php');            // класс страницы для внесения ответов в базу
require_once(INCLUDES_DIR. 'edit_page.class.php');              // класс страницы - "ИЗМЕНИТЬ ОТВЕТ"
require_once(INCLUDES_DIR. 'category_page.class.php');       	// класс страницы - "ДОБАВИТЬ КАТЕГОРИЮ"
require_once(INCLUDES_DIR. 'example_question.class.php');       // класс для добавления в базу тестовых демонстрационных категорий с вопросами и ответами

// +----------------+
// | классы страниц |
// +----------------+
require_once(INCLUDES_DIR.'entrance_page.class.php');


// +-----------------------------------+
// |  CПИСОК ТЕСТОВЫХ МОДУЛЕЙ ПРОЕКТА  |
// +-----------------------------------+
require_once(TEST_DIR.'data_add.test.php');                     // общие данные для тестовых модулей

require_once(TEST_BASE_DIR.'navigation.test.php');              // тестирование базового класса навигации
require_once(TEST_BASE_DIR.'database.test.php');                // тестирование базового класса для работы с базой
require_once(TEST_BASE_DIR.'search.test.php');                  // тестирование класса поиска информации в базе


require_once(TEST_DIR.  'utils.test.php');                      // общие утилиты для тестов
require_once(TEST_DIR.  'nav_question.test.php');               // тестирование
require_once(TEST_DIR.  'question_base.test.php');              // тестирование класса для работы с базой "Questions"
require_once(TEST_DIR.  'search_question.test.php');            // тестирование класса поиска в базе "Questions"

require_once(TEST_DIR.'register_page.test.php');                // тестирование класса регистрации пользователя
require_once(TEST_DIR.'entrance_page.test.php');                // тестирование авторизации пользователя
require_once(TEST_DIR.'view_question_page.test.php');           // тестирование класса просмотра вопросов
require_once(TEST_DIR.'main_page.test.php');                    // тестирование состояний главной страницы
require_once(TEST_DIR.'answer_page.test.php');
require_once(TEST_DIR.'edit_page.test.php');
require_once(TEST_DIR.'category_page.test.php');


// СНИМАЕМ ОГРАНИЧЕНИЯ НА ВРЕМЯ РАБОТЫ СКРИПТА
set_time_limit( 0 );




// запоминаем начальное врем
$start_time = time();

$suite = new PHPUnit_TestSuite();
// тест подготавливающий данные, которые могут использоваться всеми тестами
$suite->addTest(new DataAddTest('AddTestDataInDatabase'));


$suite->addTest(new DatabaseTest('testConnectBase'));
$suite->addTest(new DatabaseTest('testGetRequest'));

$suite->addTest(new NavigationTest('testGetNavigator'));
$suite->addTest(new NavigationTest('testGetTreeCategories'));
$suite->addTest(new NavigationTest('testSelectRange'));

$suite->addTest(new QuestionBaseTest('testAddQuestionOrSearch'));           //!< тест проверяет запрос списока вопросов по выбранной категории. 
$suite->addTest(new QuestionBaseTest('testGetCategoryQuestions'));          //!< тест проверяет смену категории для выбранного вопроса ( вопросов ).
$suite->addTest(new QuestionBaseTest('testgetAllQuestionsAnswerOrNot'));    //!< тест проверяет получение вопросов без ответа
$suite->addTest(new QuestionBaseTest('testChangeCategory'));                //!< тест проверяет удаление вопроса (вопросы).
$suite->addTest(new QuestionBaseTest('testDelQuestions'));                  //!< тест проверяет удаление вопроса (вопросы).
$suite->addTest(new QuestionBaseTest('testAddAnswer'));                     //!< тест проверяет добавление ответа  на вопрос в базу.
$suite->addTest(new QuestionBaseTest('testAddCategory'));                   //!< тест проверяет добавление новой категории в базу.
$suite->addTest(new QuestionBaseTest('testDelCategory'));                   //!< тест проверяет удаление категории из базы.

$suite->addTest(new SearchTest('testCheckInterface'));                      //!< тест проверяет наличие интерфейсов базового класса поиска

$suite->addTest(new SearchQuestionTest('testSearchPhrase'));
$suite->addTest(new SearchQuestionTest('testSearchPhraseInQuestionAnswer'));

$suite->addTest(new RegisterPageTest('testUpdate'));                        //!< тест регистрации нового пользователя						
$suite->addTest(new EntrancePageTest('testUpdate'));                        //!< тест авторизации пользователя


$suite->addTest(new MainPageTest('testUpdate'));                            //!< тест авторизации главной административной страницы
$suite->addTest(new ViewQuestionPageTest('testUpdate'));                    //!< тест состояний страницы просмотра  		- "ВОПРОСЫ"
$suite->addTest(new AnswerPageTest('testUpdate'));                          //!< тест состояний страницы администратора    	- "ДОБАВИТЬ ОТВЕТ"
$suite->addTest(new EditPageTest('testUpdate'));                            //!< тест состояний административной страницы  	- "ИЗМЕНИТЬ ОТВЕТ"
$suite->addTest(new CategoryPageTest('testUpdate'));                        //!< тест состояний административной страницы  	- "ДОБАВИТЬ КАТЕГОРИЮ"




// тест удаляющий данные, должен вызываться ПОСЛЕДНИМ
$suite->addTest(new DataAddTest('DeleteTestDataInDatabase'));

$result = PHPUnit::run($suite);
print $result->toHTML();
print "Общее количество тестов => ".$suite->countTestCases();


//******************************************************
//  дополнительные данные о времени выполнения тестов
//******************************************************
$delta = time() - $start_time;
$str_min_second = sprintf("%d min, %d sec", $delta/60, $delta%60);
print "<br>Time of performance - $delta sec ( $str_min_second )";

if ($handle = fopen("result_time", "a+")) {
    fwrite($handle, "Time of performance - $delta sec ( $str_min_second ) \n");
    fclose($handle);
}


session_destroy();

?>



